package com.sinosoft.brokerchannel.base.server;

import java.util.Date;


import com.alibaba.fastjson.JSON;
import com.sinosoft.brokerchannel.base.common.ChannelConstants;
import com.sinosoft.brokerchannel.base.model.*;
import com.sinosoft.brokerchannel.base.utile.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**   
  * 需求名称:
  * 类描述:[一句话描述该类的功能]
  * @author wem
  * @date [2017年9月23日 下午3:48:23]
  * @version [v1.0]
  */
@ResponseBody
@ControllerAdvice
public class ExceptionServer {
	
	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	/**
	 * 邮件发送工具
	 */
	@Autowired
	private EmailUtils mailUtil;

	/**
	 *
	 *  需求名称：[需求/BUG名称]
	 *  功能:[该方法捕获所有本系统已知的异常]
	 *  @author [@wem]
	 *  @date 2017年9月25日 下午2:36:27
	 *  功能说明：服务生调用时，seed不传，其他必传
	 *  @param ex - 异常信息
	 *  @return 返回请求方报文信息
	 */
	@ExceptionHandler(value = BusinessException.class)
	public String processorBusinessException(BusinessException ex) throws BusinessException {
		this.logger.error(ex.getMessage());
		if(!ToolUtils.isNullOrEmpty(ex.getE())){
			logger.error("processorBusinessException 异常", ex.getE());
		}
		//报文内容
		ResContentCommonVO contentVO = new ResContentCommonVO();
		contentVO.setUuid(ex.getUuid());
		contentVO.setTimestamp(ToolUtils.getTimestamp());
		contentVO.setBizContent("");
		contentVO.setErrorCode(ex.getExceptionCode());
		contentVO.setErrorMsg(ex.getExceptionMessage());

		//报文格式
		ResPacketCommonVO packetVO = new ResPacketCommonVO();
		packetVO.setInscompanyId(ex.getCompanyCode());
		String content;
		logger.warn("=============未传加密参数============");
		content = ToolUtils.obj2json(contentVO);
		packetVO.setContent(content);
		mailUtil.sendException(ex);
		return ToolUtils.obj2json(packetVO);
	}

	/**
	 *  需求名称：[需求/BUG名称]
	 *  功能:[捕获系统所有异常,以免暴露错误给外部]
	 *  @author [@wem]
	 *  @date 2017年9月25日 下午2:23:20
	 *  @param ex - 异常信息
	 *  @return 返回报文
	 */
	@ExceptionHandler(value = Exception.class)
	public String processorException(Exception ex) {
		this.logger.warn("非车理赔渠道平台出现异常-系统日期 {} , 错误信息: {} ",
				ToolUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss") , ex.getMessage());
		this.logger.error(ex.getMessage());
		String formatDate = ToolUtils.formatDate(new Date(), "yyyMMdd hh:mm:ss");
		Result result = new Result(ChannelConstants.ExceptionResult.ERROR.getCode(), "", ex.getMessage(), "", "",formatDate);

		mailUtil.sendException(ex);
		return JSON.toJSONString(result);
	}
}
